package com.ingenio.siot.adapter;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.ingenio.siot.Adapter;
import com.ingenio.siot.entity.Criterio;
import com.ingenio.siot.entity.CriterioIntervalo;
import com.ingenio.siot.entity.Estado;
import com.ingenio.siot.entity.TipoIntervalo;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

public class CriterioIntervaloAdapter extends Adapter{
	
	public List<CriterioIntervalo> devolverTodos() throws Exception{
    	Connection conn = null;
    	List<CriterioIntervalo> intervalos = new ArrayList<CriterioIntervalo>();
    	PreparedStatement stmt = null;
    	EstadoAdapter ea = new EstadoAdapter();
    	CriterioAdapter ca = new CriterioAdapter();
    	TipoIntervaloAdapter tia = new TipoIntervaloAdapter();
    	Criterio c = null;
    	Estado est = null;
    	TipoIntervalo ti = null;
		try {
			conn = (Connection) abrirConexion();
			String sel ="SELECT * FROM criteriosintervalos ";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		ResultSet result = stmt.executeQuery();
    		CriterioIntervalo ci = null;
    		
    		while(result.next()){
    			Integer idCriterio = result.getInt("IdCriterio");
    			c = ca.devolverCriterio(idCriterio);
    			Integer idTipoIntervalo = result.getInt("IdTipoIntervalo");
    			ti = tia.devolverTipoIntervalo(idTipoIntervalo);
    			Integer idEstado = result.getInt("IdEstado");
    			est = ea.devolverEstado(idEstado);
    			Double valorMinimo = result.getDouble("valorMinimo");
    			Double valorMaximo = result.getDouble("valorMaximo");
    			ci = new CriterioIntervalo(ti, c, est, valorMinimo, valorMaximo);
    			intervalos.add(ci);
    		}
		}
		catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
    	return intervalos;
    }
	
	public CriterioIntervalo devolverCriterioIntervalo(Integer idCriterioIntervalo) throws Exception{
		Connection conn = null;
		CriterioIntervalo ci = null;
		PreparedStatement stmt = null;
		EstadoAdapter ea = new EstadoAdapter();
    	CriterioAdapter ca = new CriterioAdapter();
    	TipoIntervaloAdapter tia = new TipoIntervaloAdapter();
    	Criterio c = null;
    	Estado est = null;
    	TipoIntervalo ti = null;
		try{
			conn = (Connection) abrirConexion();
			String query = "SELECT * FROM criteriosintervalos WHERE IdCriterioIntervalo = ? ";
			stmt = (PreparedStatement) conn.prepareStatement(query);
			stmt.setInt(1, idCriterioIntervalo);
			ResultSet result = stmt.executeQuery();
			if(result.next()){
				Integer idCriterio = result.getInt("IdCriterio");
    			c = ca.devolverCriterio(idCriterio);
    			Integer idTipoIntervalo = result.getInt("IdTipoIntervalo");
    			ti = tia.devolverTipoIntervalo(idTipoIntervalo);
    			Integer idEstado = result.getInt("IdEstado");
    			est = ea.devolverEstado(idEstado);
    			Double valorMinimo = result.getDouble("valorMinimo");
    			Double valorMaximo = result.getDouble("valorMaximo");
    			ci = new CriterioIntervalo(ti, c, est, valorMinimo, valorMaximo);
			}
		}
		catch (Exception e){
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos", e);
		}
		finally{
			cerrarConexion(conn);
		}
		return ci;
	}
	
	public List<CriterioIntervalo> devolverIntervalosDelCriterio(Criterio criterio) throws Exception{
    	Connection conn = null;
    	List<CriterioIntervalo> intervalos = new ArrayList<CriterioIntervalo>();
    	PreparedStatement stmt = null;
    	EstadoAdapter ea = new EstadoAdapter();
    	TipoIntervaloAdapter tia = new TipoIntervaloAdapter();
    	Estado est = null;
    	TipoIntervalo ti = null;
		try {
			conn = (Connection) abrirConexion();
			String sel ="SELECT * FROM criteriosintervalos WHERE IdCriterio = ? ";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		stmt.setInt(1, criterio.getIdCriterio());
    		ResultSet result = stmt.executeQuery();
    		CriterioIntervalo ci = null;
    		
    		while(result.next()){
    			Integer idTipoIntervalo = result.getInt("IdTipoIntervalo");
    			ti = tia.devolverTipoIntervalo(idTipoIntervalo);
    			Integer idEstado = result.getInt("IdEstado");
    			est = ea.devolverEstado(idEstado);
    			Double valorMinimo = result.getDouble("valorMinimo");
    			Double valorMaximo = result.getDouble("valorMaximo");
    			ci = new CriterioIntervalo(ti, criterio, est, valorMinimo, valorMaximo);
    			intervalos.add(ci);
    		}
		}
		catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
    	return intervalos;
    }
	
	public boolean guardarCriterioIntervalos(List<CriterioIntervalo> intervalos, Integer idCriterio, Connection conn) throws Exception{
		try{
			String add_intervalo = "INSERT into criteriosIntervalos (IdCriterio, IdEstado, IdTipoIntervalo,valorMinimo,valorMaximo) " +
					"VALUES (?,?,?,?,?)";
			PreparedStatement stmtInsert = (PreparedStatement) conn.prepareStatement(add_intervalo);
			for (CriterioIntervalo critIntervalo : intervalos) {
				stmtInsert.setInt(1, idCriterio);
				stmtInsert.setInt(2, critIntervalo.getEstado().getIdEstado());
				stmtInsert.setInt(3, critIntervalo.getTipoIntervalo().getIdTipoIntervalo());
				stmtInsert.setDouble(4, critIntervalo.getValorMinimo());
				stmtInsert.setDouble(5, critIntervalo.getValorMaximo());
				
				stmtInsert.addBatch();
			}
			stmtInsert.executeBatch();
	    }catch(Exception e){
			e.printStackTrace();
			return false;
		}
    	return true;
	}
	
	public List<Estado> devolverEstadosCriterio(Criterio criterio) throws Exception{
    	Connection conn = null;
    	List<Estado> estados = new ArrayList<Estado>();
    	PreparedStatement stmt = null;
    	EstadoAdapter ea = new EstadoAdapter();
    	Estado est = null;
		try {
			conn = (Connection) abrirConexion();
			String sel ="SELECT DISTINCT IdEstado FROM criteriosintervalos WHERE IdCriterio = ? ";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		stmt.setInt(1, criterio.getIdCriterio());
    		ResultSet result = stmt.executeQuery();
    		
    		while(result.next()){
    			Integer idEstado = result.getInt("IdEstado");
    			est = ea.devolverEstado(idEstado);
    			
    			estados.add(est);
    		}
		}
		catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
    	return estados;
    }
}
